"""
通过列表生成式（列表推导式），我们可以直接创建一个列表。
但是，受到内存限制，列表容量肯定是有限的。
而且，创建一个包含100万个元素的别表，不仅占用很大的存储空间，
如果我们仅仅需要访问前面几个元素，那后面绝大多数元素占用的空间都白白浪费了。
所以，如果列表元素可以按照某种算法推导出来，那我们是否可以在循环的过程种不断推算出后续的元素呢？
这样就不必创建完整的list，从而节省大量空间，在python中，这种一边循环一边计算的机制，称为生成器：generator
"""

newList = [x * 3 for x in range(21)]

print(newList)
print(type(newList))

# 得到生成器
g = (x * 3 for x in range(21))
print(g)  # <generator object <genexpr> at 0x103c887d0>
print(type(g))  # <class 'generator'>

print(g.__next__())
print(next(g))

for i in g:
    print(i, end=' ')

print()
print('@' * 40)


# 函数生成器
def func():
    n = 0
    while True:
        n += 1
        yield n


f = func()
print(f)
print(type(f))
print(next(f))
